home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / STUTTGART / LANG / C / LIB / UNIXLIB37B / !UnixLib37 / src / resource / c / setprior < prev    next >
Text File  |  1996-11-09  |  2KB  |  112 lines

  1. /****************************************************************************
  2.  *
  3.  * $Source: /unixb/home/unixlib/source/unixlib37/src/resource/c/RCS/setprior,v $
  4.  * $Date: 1996/05/06 09:03:13 $
  5.  * $Revision: 1.2 $
  6.  * $State: Rel $
  7.  * $Author: unixlib $
  8.  *
  9.  * $Log: setprior,v $
  10.  * Revision 1.2  1996/05/06 09:03:13  unixlib
  11.  * Updates to sources made by Nick Burrett, Peter Burwood and Simon Callan.
  12.  * Saved for 3.7a release.
  13.  *
  14.  * Revision 1.1  1996/04/19 21:29:28  simon
  15.  * Initial revision
  16.  *
  17.  ***************************************************************************/
  18.  
  19. static const char rcs_id[] = "$Id: setprior,v 1.2 1996/05/06 09:03:13 unixlib Rel $";
  20.  
  21. #include <errno.h>
  22. #include <sys/resource.h>
  23. #include <sys/unix.h>
  24. #include <limits.h>
  25.  
  26. /* A return value of zero indicates success.  */
  27.  
  28. int
  29. setpriority (enum __priority_which which, int who, int prio)
  30. {
  31.   int i;
  32.  
  33.   if (who == 0)
  34.     {
  35.       /* Set the priority of the current process.  */
  36.       switch (which)
  37.     {
  38.     case PRIO_PROCESS:
  39.       __u->ppri = (prio > PRIO_MAX) ? PRIO_MAX
  40.         : (prio < PRIO_MIN) ? PRIO_MIN : prio;
  41.       return 0;
  42.       break;
  43.     case PRIO_PGRP:
  44.       __u->gpri = (prio > PRIO_MAX) ? PRIO_MAX
  45.         : (prio < PRIO_MIN) ? PRIO_MIN : prio;
  46.       return 0;
  47.       break;
  48.     case PRIO_USER:
  49.       __u->upri = (prio > PRIO_MAX) ? PRIO_MAX
  50.         : (prio < PRIO_MIN) ? PRIO_MIN : prio;
  51.       return 0;
  52.       break;
  53.     default:
  54.       errno = EINVAL;
  55.       return -1;
  56.     }
  57.       return -1;
  58.     }
  59.  
  60.   for (i = 0; i < CHILD_MAX; i++)
  61.     {
  62.       switch (which)
  63.     {
  64.     case PRIO_PROCESS:
  65.       if (__u->child[i].pid == who)
  66.         {
  67.           if (__u->child[i].gpri > prio)
  68.         {
  69.           errno = EACCES;
  70.           return -1;
  71.         }
  72.           __u->child[i].ppri = (prio > PRIO_MAX) ? PRIO_MAX
  73.         : (prio < PRIO_MIN) ? PRIO_MIN : prio;
  74.           return 0;
  75.         }
  76.       break;
  77.     case PRIO_PGRP:
  78.       if (__u->child[i].gid == who)
  79.         {
  80.           if (__u->child[i].gpri > prio)
  81.         {
  82.           errno = EACCES;
  83.           return -1;
  84.         }
  85.           __u->child[i].gpri = (prio > PRIO_MAX) ? PRIO_MAX
  86.         : (prio < PRIO_MIN) ? PRIO_MIN : prio;
  87.           return 0;
  88.         }
  89.       break;
  90.     case PRIO_USER:
  91.       if (__u->child[i].uid == who)
  92.         {
  93.           if (__u->child[i].upri > prio)
  94.         {
  95.           errno = EACCES;
  96.           return -1;
  97.         }
  98.           __u->child[i].upri = (prio > PRIO_MAX) ? PRIO_MAX
  99.         : (prio < PRIO_MIN) ? PRIO_MIN : prio;
  100.           return 0;
  101.         }
  102.       break;
  103.     default:
  104.       errno = EINVAL;
  105.       return -1;
  106.     }
  107.     }
  108.   /* Value of 'which' was invalid.  */
  109.   errno = ESRCH;
  110.   return -1;
  111. }
  112.